package main

import (
	"fmt"
	"github.com/beego/beego/v2/client/orm"
	_ "github.com/go-sql-driver/mysql"
	"log"
	"time"
)

func init() {
	// orm 设置
	orm.SetMaxIdleConns("default", 30) // 最大空闲连接
	orm.SetMaxOpenConns("default", 30) // 最大数据库连接，最多能有多少个连接
	// ORM 在进行 RegisterDataBase 的同时，会获取数据库使用的时区，然后在 time.Time 类型存取时做相应转换，以匹配时间系统，从而保证时间不会出错。
	orm.DefaultTimeLoc = time.UTC // 设置时区

	// 注册
	orm.RegisterDriver("mysql", orm.DRMySQL) // 支持多种数据库，此处以 MySQL 为例
	// ORM 必须注册一个别名为 default 的数据库，作为默认使用，default 数据库是必须的¬
	orm.RegisterDataBase("default", "mysql", "root:123456@tcp(localhost:3306)/go-sql")
}

func main() {
	o := orm.NewOrm()

	// 可以使用自己的数据库连接池
	// var db *sql.DB
	// o, _ = orm.NewOrmWithDB("mysql", "default", db)

	// 获得数据库连接池对象
	db, err := orm.GetDB("default")
	if err != nil {
		log.Printf("get DB err: %v\n", err)
	}
	db.Ping()

	// 重置已经注册的模型，一般用于编写测试
	// orm.ResetModelCache()

	// 数据处理
	profile := new(Profile)
	profile.Age = 30

	user := new(User)
	user.Profile = profile
	user.Name = "pedro"

	fmt.Println(o.Insert(profile))
	fmt.Println(o.Insert(user))

	// 查询表
	qs := o.QueryTable("user")
	qs.All([]User{}, "id") // 查询所有用户
	// 使用 where
	qs.Filter("id", 1)
	qs.Filter("profile__age", 18)                                 // where profile.age = 18
	qs.Filter("profile__age__gt", 18)                             // where profile.age > 18
	qs.Filter("profile__age__in", 18, 20).Exclude("id__lt", 1000) // where profile.age in (18,20) and not id < 1000

	// 原生查询
	o.Raw("SELECT FROM user WHERE id = ?", 1)
	// prepare
	p, err := o.Raw("SELECT FROM user WHERE id = ?", 1).Prepare()
	p.Exec(2)

	// 多数据库支持
	// orm.RegisterDataBase("db2", "sqlite3", "data.db")
	// o2 := orm.NewOrmUsingDB("db2")
	// dr = o2.Driver()
	// fmt.Println(dr.Name() == "db2") // true
	// fmt.Println(dr.Type() == orm.DRSqlite) // true

	// 设置日志 writer
	// var w io.Writer
	// orm.DebugLog = orm.NewLog(w)
}
